const client = require("./client");
const spinner = require("./spinner");
const lark = require('@larksuiteoapi/node-sdk');
const fs = require('fs');
const path = require('path');

// 配置文件路径
const CONFIG_FILE = path.join(__dirname, 'bitable_config.json');

// 读取或创建配置文件
const readConfig = () => {
  try {
    if (fs.existsSync(CONFIG_FILE)) {
      const data = fs.readFileSync(CONFIG_FILE, 'utf8');
      return JSON.parse(data);
    }
    return null;
  } catch (error) {
    console.error('读取配置文件失败:', error.message);
    return null;
  }
};

// 保存配置文件
const saveConfig = (config) => {
  try {
    fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf8');
    return true;
  } catch (error) {
    console.error('保存配置文件失败:', error.message);
    return false;
  }
};

// 读取temp_push_data.json文件
const readSummarizationFile = () => {
  try {
    const filePath = path.join(__dirname, '../summaries/temp_push_data.json');
    const data = fs.readFileSync(filePath, 'utf8');
    return JSON.parse(data);
  } catch (error) {
    console.error('读取temp_push_data.json文件失败:', error.message);
    return null;
  }
};

// 检查多维表格是否存在
const checkBitableExists = async (app_token) => {
  try {
    const options = {};
    if (client.userAccessToken) {
      Object.assign(options, lark.withUserAccessToken(client.userAccessToken));
    }
    const { data } = await client.bitable.app.get({
      path: {
        app_token: app_token,
      },
    }, options);
    return data;
  } catch (e) {
    console.log('多维表格不存在或无法访问');
    return null;
  }
};

// 获取表格列表
const getTableList = async (app_token) => {
  try {
    const options = {};
    if (client.userAccessToken) {
      Object.assign(options, lark.withUserAccessToken(client.userAccessToken));
    }
    const { data } = await client.bitable.appTable.list({
      path: {
        app_token: app_token,
      },
    }, options);
    return data;
  } catch (e) {
    console.error('获取表格列表失败:', e);
    return null;
  }
};

// 创建多维表格
const createBitable = async (name) => {
  const execSpinner = spinner("创建多维表格中");
  try {
    const options = {};
    if (client.userAccessToken) {
      Object.assign(options, lark.withUserAccessToken(client.userAccessToken));
    }
    const { data } = await client.bitable.app.create({
      data: {
        name: name,
      },
    }, options);
    execSpinner.succeed("多维表格创建成功");
    return data;
  } catch (e) {
    execSpinner.fail("多维表格创建失败");
    console.error(e);
    return null;
  }
};

// 添加数据表
const addTable = async (app_token, table_name) => {
  const execSpinner = spinner("添加数据表中");
  try {
    const options = {};
    if (client.userAccessToken) {
      Object.assign(options, lark.withUserAccessToken(client.userAccessToken));
    }
    const response = await client.bitable.appTable.create({
      path: {
        app_token: app_token,
      },
      data: {
        table: {
          name: table_name,
          fields: [
            {
              field_name: "标题",
              type: 1, // 多行文本
            },
            {
              field_name: "内容摘要",
              type: 1, // 多行文本
            },
            {
              field_name: "创建时间",
              type: 5, // 日期时间
            },
            {
              field_name: "来源文件",
              type: 1, // 多行文本
            }
          ]
        }
      },
    }, options);
    execSpinner.succeed("数据表添加成功");
    return response.data;
  } catch (e) {
    execSpinner.fail("数据表添加失败");
    console.error(e);
    return null;
  }
};

// 添加记录到表格
const addRecord = async (app_token, table_id, title, content, source) => {
  const execSpinner = spinner("添加记录中");
  try {
    const options = {};
    if (client.userAccessToken) {
      Object.assign(options, lark.withUserAccessToken(client.userAccessToken));
    }
    const { data } = await client.bitable.appTableRecord.batchCreate({
      path: {
        app_token: app_token,
        table_id: table_id,
      },
      data: {
        records: [
          {
            fields: {
              "标题": title,
              "内容摘要": content,
              "创建时间": new Date().getTime(),
              "来源文件": source || "未知来源"
            }
          }
        ],
      },
    }, options);
    execSpinner.succeed("记录添加成功");
    return data;
  } catch (e) {
    execSpinner.fail("记录添加失败");
    console.error(e);
    return null;
  }
};

// 主函数：推送summarization到飞书多维表格
const pushSummarizationToBitable = async () => {
  console.log('\n=== 开始推送Summarization到飞书多维表格 ===\n');
  
  // 1. 读取temp_push_data.json文件
  const summaryData = readSummarizationFile();
  if (!summaryData) {
    console.error('无法读取summarization数据，退出程序');
    return;
  }
  
  console.log('读取到的数据:');
  console.log('标题:', summaryData.title);
  console.log('来源:', summaryData.source || '未知来源');
  
  // 处理summary字段（可能是数组或字符串）
  let summaryText = '';
  if (Array.isArray(summaryData.summary)) {
    summaryText = summaryData.summary.join('\n');
  } else {
    summaryText = summaryData.summary;
  }
  console.log('内容:', summaryText.substring(0, 100) + '...');
  
  // 2. 检查是否已有配置的多维表格
  let config = readConfig();
  let app_token = null;
  let table_id = null;
  let bitableUrl = null;
  
  if (config && config.app_token) {
    console.log('\n检查现有多维表格...');
    const existingBitable = await checkBitableExists(config.app_token);
    
    if (existingBitable) {
      // 优先显示配置文件中的名称，如果没有则显示API返回的名称
      const displayName = config.name || existingBitable.app.name;
      console.log('✅ 找到现有多维表格:', displayName);
      app_token = config.app_token;
      // 手动构造多维表格访问URL
      bitableUrl = `https://feishu.cn/base/${app_token}`;
      
      // 如果配置中已有table_id，直接使用
      if (config.table_id) {
        table_id = config.table_id;
        console.log('✅ 使用配置中的数据表ID:', table_id);
      } else {
        // 不使用现有数据表，强制创建新表
        console.log('🔄 配置中无table_id，将创建新的数据表');
      }
    } else {
      console.log('❌ 配置的多维表格不存在或无法访问，将创建新的');
      config = null;
    }
  }
  
  // 3. 如果没有现有表格，创建新的多维表格
  if (!app_token) {
    console.log('\n创建新的多维表格...');
    const bitableResult = await createBitable('AI解析结果汇总');
    if (!bitableResult) {
      console.error('创建多维表格失败，退出程序');
      return;
    }
    
    app_token = bitableResult.app.app_token;
    // 手动构造多维表格访问URL
    bitableUrl = `https://feishu.cn/base/${app_token}`;
    console.log('\n多维表格创建成功!');
    console.log('App Token:', app_token);
    console.log('访问链接:', bitableUrl);
    
    // 保存配置
    const newConfig = {
      app_token: app_token,
      created_at: new Date().toISOString(),
      name: 'AI解析结果汇总'
    };
    saveConfig(newConfig);
    console.log('✅ 配置已保存');
  }
  
  // 4. 如果没有现有数据表，添加数据表
  if (!table_id) {
    console.log('\n添加数据表...');
    // 生成带时间戳的唯一表名
    const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
    const uniqueTableName = `Summarization记录_${timestamp}`;
    const tableResult = await addTable(app_token, uniqueTableName);
    if (!tableResult || !tableResult.table_id) {
      console.error('添加数据表失败，退出程序');
      return;
    }
    
    table_id = tableResult.table_id;
    console.log('\n数据表创建成功!');
    console.log('Table ID:', table_id);
    
    // 更新配置
    const updatedConfig = readConfig();
    if (updatedConfig) {
      updatedConfig.table_id = table_id;
      saveConfig(updatedConfig);
    }
  }
  
  // 5. 添加记录
  const recordResult = await addRecord(app_token, table_id, summaryData.title, summaryText, summaryData.source);
  if (!recordResult) {
    console.error('添加记录失败');
    return;
  }
  
  console.log('\n=== 推送完成 ===');
  console.log('记录ID:', recordResult.records[0].record_id);
  console.log('\n请访问以下链接查看结果:');
  console.log(bitableUrl);
  
  return {
    success: true,
    app_token: app_token,
    table_id: table_id,
    record_id: recordResult.records[0].record_id,
    url: bitableUrl
  };
};

module.exports = {
  pushSummarizationToBitable,
  readSummarizationFile,
  createBitable,
  addTable,
  addRecord,
  readConfig,
  saveConfig,
  checkBitableExists,
  getTableList
};